package com.ruoyi.web.convert;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONArray;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.stream.Collectors;

/**
 * HBS数据转换工具类
 */
@Component
public class HbsDataConverter {

    /**
     * 根据字段配置转换数据
     * @param fieldConfig 字段配置信息
     * @param fieldValue 字段值
     * @return 转换后的值
     */
    public String convertFieldValue(JSONObject fieldConfig, Object fieldValue) {
        if (fieldValue == null) {
            return null;
        }

        String fieldType = fieldConfig.getStr("field_type");

        switch (fieldType) {
            case "category":
                // 存储选项名称
                return getCategoryOptionName(fieldValue, fieldConfig);
            case "input":
                // 存储文本内容
                return fieldValue != null ? fieldValue.toString() : null;
            case "relation":
                // 存储关联对象名称
                return getRelationName(fieldValue, fieldConfig);
            case "calculation":
                // 存储计算结果
                return fieldValue != null ? fieldValue.toString() : null;
            case "numeric":
                // 存储数值
                return fieldValue != null ? fieldValue.toString() : null;
            default:
                return fieldValue != null ? fieldValue.toString() : null;
        }
    }

    /**
     * 根据选项ID获取选项名称
     */
    private String getCategoryOptionName(Object value, JSONObject fieldConfig) {
        if (value == null) {
            return null;
        }

        // 处理数组形式的category数据 [{\"id\":\"1\",\"name\":\"在售\"}]
        if (value instanceof JSONArray) {
            JSONArray array = (JSONArray) value;
            if (!array.isEmpty()) {
                JSONObject firstItem = array.getJSONObject(0);
                return firstItem.getStr("name");
            }
            return null;
        }

        // 处理普通形式的category数据
        JSONObject config = fieldConfig.getJSONObject("config");
        if (config == null) {
            return value.toString();
        }

        JSONArray options = config.getJSONArray("options");
        if (CollectionUtils.isEmpty(options)) {
            return value.toString();
        }

        String valueStr = value.toString();
        for (int i = 0; i < options.size(); i++) {
            JSONObject option = options.getJSONObject(i);
            String optionId = option.getStr("id");
            String optionName = option.getStr("name");

            if (valueStr.equals(optionId)) {
                return optionName;
            }
        }

        return valueStr;
    }

    /**
     * 获取关联对象名称
     */
    private String getRelationName(Object value, JSONObject fieldConfig) {
        if (value == null) {
            return null;
        }

        // 处理数组形式的relation数据 [{\"item_id\":\"2300014080333991\",\"title\":\"宁波大红鹰药业股份有限公司\"}]
        if (value instanceof JSONArray) {
            JSONArray array = (JSONArray) value;
            if (!array.isEmpty()) {
                List<String> titles = array.stream()
                    .filter(item -> item instanceof JSONObject)
                    .map(item -> ((JSONObject) item).getStr("title"))
                    .filter(title -> title != null && !title.isEmpty())
                    .collect(Collectors.toList());

                return String.join(",", titles);
            }
            return null;
        }

        // 处理对象形式的relation数据
        if (value instanceof JSONObject) {
            JSONObject relationObj = (JSONObject) value;
            return relationObj.getStr("title");
        }

        // 处理配置信息
        JSONObject config = fieldConfig.getJSONObject("config");
        if (config == null) {
            return value.toString();
        }

        // 判断是否为多选
        Integer isMulti = config.getInt("is_multi", 0);

        if (isMulti == 1) {
            // 多选关联，value应该是一个数组
            if (value instanceof JSONArray) {
                JSONArray array = (JSONArray) value;
                List<String> names = array.stream()
                    .filter(item -> item instanceof JSONObject)
                    .map(item -> ((JSONObject) item).getStr("title"))
                    .filter(name -> name != null && !name.isEmpty())
                    .collect(Collectors.toList());

                return String.join(",", names);
            } else {
                return value.toString();
            }
        } else {
            // 单选关联
            if (value instanceof JSONObject) {
                JSONObject relationObj = (JSONObject) value;
                return relationObj.getStr("title");
            } else {
                return value.toString();
            }
        }
    }
}
